<script>
    let flatArr=[
    {
        "id": 1,
        "name": "北京",
        "parentId": 0
    },
    {
        "id": 4,
        "name": "南京",
        "parentId": 2
    },
    {
        "id": 5,
        "name": "徐州",
        "parentId": 2
    },
    {
        "id": 6,
        "name": "扬州",
        "parentId": 2
    },
    {
        "id": 2,
        "name": "江苏",
        "parentId": 0
    },
    {
        "id": 9,
        "parentId": 7,
        "name": "平铺"
    },
    {
        "id": 7,
        "parentId": 3,
        "name": "滁州"
    },
    {
        "id": 8,
        "parentId": 3,
        "name": "合肥"
    },
    {
        "id": 3,
        "name": "安徽",
        "parentId": 0
    }
]

//扁平数据转换成树形，先去找父节点,还要区分一级的节点
//每条数据只会有一个根数据

//currentKey 就是当前节点的字段标识（属性名)
//parentKey 就是父节点的字段标识（属性名）
function toTree(data,currentKey='id',parentKey='parentId'){
    //存储树形数据的数组
    let treeArr=[];
    //再次声明一个函数
    function recursion(data){
        data.forEach(item=>{
            //说明这个是一个子节点
            if(item.parentId){
                //找他的父节点去
                let parent=data.find(p=>p[currentKey]===item[parentKey]);
                //判断父节点是否有children属性
                if(!parent[childKey]){
                    //添加一个children属性，并且是一个空数组
                    parent[childKey]=[]
                }
                parent[childKey].push(item)
            }else{
                treeArr.push(item)
            }
        })
    }
    recursion(data)
    return treeArr;
}
let tree= toTree(flatArr)
console.log(tree)
</script>